/*
 * Copyright (C) 2025 Tsingteng MicroSystem
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef _NFC_LOG_API_H_
#define _NFC_LOG_API_H_
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "nfc_log_impl.h"
/**
 * @file nfc_log_api.h
 * @brief nfc log模块函数、宏声明
*/

#ifdef __cplusplus
extern "C" {
#endif

#define TAG "tmsnci"

#define LOG_LEVEL_MUTE  0x00
#define LOG_LEVEL_ERROR 0x01
#define LOG_LEVEL_WARN  0x02
#define LOG_LEVEL_INFO  0x03
#define LOG_LEVEL_DEBUG 0x04

typedef enum {
    LEVEL_MUTE  = LOG_LEVEL_MUTE,
    LEVEL_ERROR = LOG_LEVEL_ERROR,
    LEVEL_WARN  = LOG_LEVEL_WARN,
    LEVEL_INFO  = LOG_LEVEL_INFO,
    LEVEL_DEBUG = LOG_LEVEL_DEBUG,
} tNFC_LOG_LEVEL;

typedef struct {
    tNFC_LOG_LEVEL level;
    bool debug_mode;
    bool print_time;
} tNFC_LOG_CONTROL_BLOCK;

/**
 * @brief 初始化 NFC 日志
 *
 * 初始化 NFC 日志的相关参数，包括日志级别、调试模式和打印时间。
 */
void nfc_log_initialize();

/**
 * @brief 获取 NFC 日志级别
 *
 * 返回 NFC 日志的当前级别。
 *
 * @return NFC 日志级别
 */
tNFC_LOG_LEVEL nfc_log_get_level();

/**
 * @brief 设置 NFC 日志级别
 *
 * 设置 NFC 日志的级别，用于控制日志的输出。
 *
 * @param level 日志级别
 */
void nfc_log_set_level(tNFC_LOG_LEVEL level);

/**
 * @brief 判断 NFC 日志是否处于调试模式
 *
 * @return 如果 NFC 日志处于调试模式，则返回 true；否则返回 false。
 */
bool nfc_log_is_debug_mode();

/**
 * @brief 设置NFC日志的调试模式
 *
 * 通过设置参数`enable`，开启或关闭NFC日志的调试模式。
 *
 * @param enable 调试模式开关，true为开启，false为关闭
 */
void nfc_log_set_debug_mode(bool enable);


#define __FILENAME__ (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : \
                     (__builtin_strrchr(__FILE__, '\\') ? __builtin_strrchr(__FILE__, '\\') + 1 : __FILE__))

#ifndef LOG_LEVEL
#define LOG_LEVEL nfc_log_get_level()
#endif

#define NFCLOG_E(fmt, ...) \
{ \
    if (LOG_LEVEL >= LEVEL_ERROR) { \
        OS_PRINT(LEVEL_ERROR, fmt, ##__VA_ARGS__) \
    } \
}

#define NFCLOG_W(fmt, ...) \
{ \
    if (LOG_LEVEL >= LEVEL_WARN) { \
        OS_PRINT(LEVEL_WARN, fmt, ##__VA_ARGS__) \
    } \
}

#define NFCLOG_I(fmt, ...) \
{ \
    if (LOG_LEVEL >= LEVEL_INFO) { \
        OS_PRINT(LEVEL_INFO, fmt, ##__VA_ARGS__) \
    } \
}

#define NFCLOG_D(fmt, ...) \
{ \
    if (LOG_LEVEL >= LEVEL_DEBUG) { \
        OS_PRINT(LEVEL_DEBUG, fmt, ##__VA_ARGS__) \
    } \
}

#ifdef COMPILE_LOG_LEVEL
// 将低于COMPILE_LOG_LEVEL的LOG宏重新定义成空

#if COMPILE_LOG_LEVEL < LOG_LEVEL_DEBUG
#undef NFCLOG_D
#define NFCLOG_D(fmt, ...)
#endif /* #if COMPILE_LOG_LEVEL < LOG_LEVEL_DEBUG */

#if COMPILE_LOG_LEVEL < LOG_LEVEL_INFO
#undef NFCLOG_I
#define NFCLOG_I(fmt, ...)
#endif /* #if COMPILE_LOG_LEVEL < LEVEL_INFO */

#if COMPILE_LOG_LEVEL < LOG_LEVEL_WARN
#undef NFCLOG_W
#define NFCLOG_W(fmt, ...)
#endif /* #if COMPILE_LOG_LEVEL < LEVEL_WARN */

#if COMPILE_LOG_LEVEL < LOG_LEVEL_ERROR
#undef NFCLOG_E
#define NFCLOG_E(fmt, ...)
#endif /* #if COMPILE_LOG_LEVEL < LEVEL_ERROR */

#endif /* #ifdef COMPILE_LOG_LEVEL */

#ifdef __cplusplus
}
#endif

#endif /* _NFC_LOG_API_H_ */
